home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Purity
/
Purity #48 (1995-06-25)(PackMAN)(DE)[WB].zip
/
Purity #48 (1995-06-25)(PackMAN)(DE)[WB].adf
/
ShowIcon
/
ShowIcon2.p
< prev
next >
Wrap
Text File
|
1995-06-23
|
7KB
|
230 lines
PROGRAM showicon2;
{ Dieses Programm zeigt, wie man die Images der Icons auf dem eigenen
Screen darstellt und ist als Testprogramm für AddiPro entstanden, der
ultimativen FD-Adressverwaltung in Pascal auf dem Amiga ! Übrigens demnächst
Auf Purity, Aminet, ... }
USES dos,gadtools,execsupport;
{$incl 'wb.lib','icon.lib'}
VAR win : p_window;
t : Array[1..15] OF TagItem;
di : p_drawinfo;
txattr: Textattr;
font : p_textfont;
fname : STRING;
vi : PTR;
msg : p_intuimessage;
gads : ARRAY[1..8] OF p_gadget;
glist : p_gadget;
pgad : p_gadget;
aktgad: p_gadget;
ok : BOOLEAN;
pscr : p_screen;
minx,miny,maxx,maxy:INTEGER;
lr : BYTE; {linker Rand in Pixel }
bh : BYTE; {Barheight}
fh : BYTE; {Fonhöhe}
fb : BYTE; {Fontbreite}
success : BOOLEAN;
i : INTEGER;
ende : BOOLEAN;
da : BOOLEAN; {ob schon das Gadget da ist}
{fürs icon}
VAR dobj : p_DiskObject;
gad : Gadget;
gw,gh : INTEGER; { Gadgetwidth, Gadgetheight }
imptr1,
imptr2 : p_image;
{ fürs appwindow }
CONST appname='Showicon2 V0.3'
version='$VER: Showicon2 V0.3 rev.10 15.06.95 21.38 UHR'
VAR
appwin: p_appwindow;
apport: p_msgport;
appmsg: p_AppMessage;
winmask,mask,
appsig: LONG;
myarg : p_wbarg;
mydir : BPTR;
dir,name : STRING[256]
{ -- AppWindow-Port -- }
PROCEDURE InitAppPort;
BEGIN
Apport := CreateMsgPort;
IF Apport = NIL THEN
BEGIN
HALT(20);
END;
ApPort^.mp_Node.ln_Name := AppName;
ApPort^.mp_Node.ln_Pri := 0;
ApPort^.mp_SigTask := FindTask(NIL);
AddPort(Apport);
END;
PROCEDURE DeleteAppPort;
VAR
msg : p_Message;
BEGIN
Forbid;
IF ApPort <> NIL THEN
BEGIN
msg := GetMsg(ApPort);
WHILE msg <> NIL DO
BEGIN
ReplyMsg(msg);
msg := GetMsg(ApPort);
END;
RemPort(ApPort);
DeleteMsgPort(ApPort);
END;
ApPort := NIL;
Permit;
END;
PROCEDURE dobjkram;
BEGIN
IF da=TRUE THEN BEGIN { Schon ein Icon geladen? }
i:=RemoveGadget(win,^gad); { altes Gadget entfernen }
freediskobject(dobj); { freigeben nicht vergessen }
END;
IF name[length(name)]='/' THEN name[length(name)]:=CHR(0); {für Verzeichnisse!}
dobj:= GetDiskObjectNew(name); { Icon holen }
gad:=dobj^.do_gadget; { Gadget aus dem icon klauen}
gw:=gad.width; { Breite, }
gh:=gad.height; { Höhe des Gadgets merken }
imptr1:=p_image(gad.GadgetRender); { das 1. image holen }
imptr2:=p_image(gad.SelectRender); { das 2. image holen }
{ Eigentlich müßte hier der Speicher für die zwei Images reserviert werden und
die Imagedatas umkopiert werden. Dummerweise weiß ich aber die Größe nicht.
Deswegen gebe ich die Diskobjektstruktur nicht mehr vor Programmende frei
-> der Speicher für die Images bleibt reserviert und das Selectimage kann
gezeichnet werden.
Wenn man mehr als ein Gadget machen will, dann muß man halt mehrere Diskobject-
strukturen definieren (am geschicktesten als Array) also für jedes gewünschte
Gadget eins. Am Programmende aber bitte nicht vergessen freizugeben! }
setwindowtitles(win,name,ptr(-1)); {Iconname in Windowitel schreiben}
gad:=gadget(NIL,win^.borderleft,bh+1,gw,gh,GFLG_GADGIMAGE+GFLG_GADGHIMAGE,
RELVERIFY,$0001,imptr1,imptr2,NIL,0,NIL,1,NIL); {Gadget zusammenbauen}
i:=ADDGADGET(win,^gad,0); { in die Gadgetliste einfügen}
REFRESHGADGETS(^gad,win,NIL); { Refreshen=zeichnen}
da:=TRUE; { Merken, dass die Diskobjektstruktur belegt ist}
END;
PROCEDURE openlibs;
BEGIN
OpenLib(WorkbenchBase, "workbench.library", 37);
OpenLib(IconBase,"icon.library",0);
END;
BEGIN
da:=FALSE;
openlibs;
ende:=FALSE;
pscr:=lockpubScreen('Workbench');
di:=NIL;
di:=getscreendrawinfo(pscr);
IF (di=NIL) THEN exit;
font:=di^.dri_font; { der folgende Kram ist teilweise unnötig }
fb:=font^.tf_ysize; { ist aber für späteren Ausbau dringeblieben }
fname:=di^.dri_font^.tf_message.mn_Node.ln_name;
txattr:=Textattr(fname,fb,0,0);
bh:=pscr^.barheight;
freescreendrawinfo(pscr,di);
initappPort;
vi:=NIL;
vi:=GetVisualInfoA(pscr,NIL);
unLockPubScreen(NIL,pscr);
Glist:=NIL;
pgad:=CreateContext(^Glist);
IF (pgad=NIL) OR (vi=NIL) THEN exit;
t[1]:=TagItem(WA_InnerWidth,250);
t[2]:=TagItem(WA_InnerHeight,100);
t[3].ti_Tag:=WA_Title;
t[3].ti_data:='Showicon2 (c) 15.06.95 by Røgersøft';
t[4]:=TagItem(WA_Idcmp,IDCMP_CLOSEWINDOW);
t[5]:=TagItem(WA_Flags,WFLG_CLOSEGADGET+WFLG_DRAGBAR+WFLG_ACTIVATE+
WFLG_DEPTHGADGET+WFLG_SMART_REFRESH+WFLG_NOCAREREFRESH);
t[6]:=TagItem(WA_Left,50);
t[7]:=TagItem(WA_Top,25);
t[8].ti_Tag:=TAG_DONE;
win:=OpenWindowTaglist(NIL,^t);
IF win=NIL THEN exit;
GT_Refreshwindow(Win,NIL);
Appwin:=AddAppwindowA(1,0,win,Apport,NIL);
IF AppWin=NIL THEN
BEGIN
Closewindow(win);
Freegadgets(glist);
Freevisualinfo(vi);
HALT(20);
END;
winmask:=LONG(1) SHL LONG(win^.Userport^.mp_SigBit);
AppSig:=LONG(1) SHL LONG(Apport^.mp_SigBIt);
REPEAT
mask:=_wait(winmask OR Appsig);
IF (mask AND appsig)=AppSig THEN
BEGIN
appmsg:=p_AppMessage(GetMsg(Apport));
WHILE (appmsg<>NIL) DO
BEGIN
IF (appmsg^.am_Type=MTYPE_APPWINDOW) THEN
BEGIN
myarg:=appmsg^.am_arglist;
name:=myarg^.wa_name;
mydir:=myarg^.wa_lock;
i:=NameFromLock(mydir,^dir,255);
IF dir[length(dir)]<>':' THEN dir:=dir+'/';
name:=dir+name;
dobjkram;
END;
Replymsg(p_message(appmsg));
appmsg:=p_appmessage(GetMsg(apport));
END; { Of WHILE }
END;
IF (mask AND winmask) = winmask THEN
BEGIN
msg:=GT_getImsg(win^.userport);
WHILE msg<>NIL DO
BEGIN
GT_ReplyImsg(msg);
CASE msg^.Class OF
IDCMP_GadgetUP:
BEGIN
aktgad:=msg^.iaddress
CASE aktgad^.gadgetID OF
1:;
ELSE END;
END;
IDCMP_CLOSEWINDOW: ende:=TRUE;
ELSE END; {OF CASE }
msg:=GT_GetImsg(win^.Userport);
END;
END;
UNTIL ende;
ok:=RemoveAppwindow(appwin);
DeleteAppPort;
IF da THEN BEGIN
i:=RemoveGadget(win,^gad); { altes Gadget entfernen }
freediskobject(dobj); { freigeben nicht vergessen }
END;
Closewindow(win);
Freegadgets(glist);
Freevisualinfo(vi);
END.